home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 April / macformat-049.iso / mac / Shareware Plus / Developers / dropg++ / usr / include / nfs / nfs.h next >
Encoding:
C/C++ Source or Header  |  1997-02-20  |  9.5 KB  |  298 lines  |  [TEXT/R*ch]

  1. /*
  2.  * Copyright (c) 1989, 1993
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Rick Macklem at The University of Guelph.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  *    @(#)nfs.h    8.1 (Berkeley) 6/10/93
  37.  */
  38.  
  39. /*
  40.  * Tunable constants for nfs
  41.  */
  42.  
  43. #define    NFS_MAXIOVEC    34
  44. #define NFS_HZ        25        /* Ticks per second for NFS timeouts */
  45. #define    NFS_TIMEO    (1*NFS_HZ)    /* Default timeout = 1 second */
  46. #define    NFS_MINTIMEO    (1*NFS_HZ)    /* Min timeout to use */
  47. #define    NFS_MAXTIMEO    (60*NFS_HZ)    /* Max timeout to backoff to */
  48. #define    NFS_MINIDEMTIMEO (5*NFS_HZ)    /* Min timeout for non-idempotent ops*/
  49. #define    NFS_MAXREXMIT    100        /* Stop counting after this many */
  50. #define    NFS_MAXWINDOW    1024        /* Max number of outstanding requests */
  51. #define    NFS_RETRANS    10        /* Num of retrans for soft mounts */
  52. #define    NFS_MAXGRPS    16        /* Max. size of groups list */
  53. #define    NFS_MINATTRTIMO 5        /* Attribute cache timeout in sec */
  54. #define    NFS_MAXATTRTIMO 60
  55. #define    NFS_WSIZE    8192        /* Def. write data size <= 8192 */
  56. #define    NFS_RSIZE    8192        /* Def. read data size <= 8192 */
  57. #define    NFS_DEFRAHEAD    1        /* Def. read ahead # blocks */
  58. #define    NFS_MAXRAHEAD    4        /* Max. read ahead # blocks */
  59. #define    NFS_MAXREADDIR    NFS_MAXDATA    /* Max. size of directory read */
  60. #define    NFS_MAXUIDHASH    64        /* Max. # of hashed uid entries/mp */
  61. #define    NFS_MAXASYNCDAEMON 20    /* Max. number async_daemons runable */
  62. #define    NFS_DIRBLKSIZ    1024        /* Size of an NFS directory block */
  63. #define    NMOD(a)        ((a) % nfs_asyncdaemons)
  64.  
  65. /*
  66.  * Set the attribute timeout based on how recently the file has been modified.
  67.  */
  68. #define    NFS_ATTRTIMEO(np) \
  69.     ((((np)->n_flag & NMODIFIED) || \
  70.      (time.tv_sec - (np)->n_mtime) / 10 < NFS_MINATTRTIMO) ? NFS_MINATTRTIMO : \
  71.      ((time.tv_sec - (np)->n_mtime) / 10 > NFS_MAXATTRTIMO ? NFS_MAXATTRTIMO : \
  72.       (time.tv_sec - (np)->n_mtime) / 10))
  73.  
  74. /*
  75.  * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs
  76.  * should ever try and use it.
  77.  */
  78. struct nfsd_args {
  79.     int    sock;        /* Socket to serve */
  80.     caddr_t    name;        /* Client address for connection based sockets */
  81.     int    namelen;    /* Length of name */
  82. };
  83.  
  84. struct nfsd_srvargs {
  85.     struct nfsd    *nsd_nfsd;    /* Pointer to in kernel nfsd struct */
  86.     uid_t        nsd_uid;    /* Effective uid mapped to cred */
  87.     u_long        nsd_haddr;    /* Ip address of client */
  88.     struct ucred    nsd_cr;        /* Cred. uid maps to */
  89.     int        nsd_authlen;    /* Length of auth string (ret) */
  90.     char        *nsd_authstr;    /* Auth string (ret) */
  91. };
  92.  
  93. struct nfsd_cargs {
  94.     char        *ncd_dirp;    /* Mount dir path */
  95.     uid_t        ncd_authuid;    /* Effective uid */
  96.     int        ncd_authtype;    /* Type of authenticator */
  97.     int        ncd_authlen;    /* Length of authenticator string */
  98.     char        *ncd_authstr;    /* Authenticator string */
  99. };
  100.  
  101. /*
  102.  * Stats structure
  103.  */
  104. struct nfsstats {
  105.     int    attrcache_hits;
  106.     int    attrcache_misses;
  107.     int    lookupcache_hits;
  108.     int    lookupcache_misses;
  109.     int    direofcache_hits;
  110.     int    direofcache_misses;
  111.     int    biocache_reads;
  112.     int    read_bios;
  113.     int    read_physios;
  114.     int    biocache_writes;
  115.     int    write_bios;
  116.     int    write_physios;
  117.     int    biocache_readlinks;
  118.     int    readlink_bios;
  119.     int    biocache_readdirs;
  120.     int    readdir_bios;
  121.     int    rpccnt[NFS_NPROCS];
  122.     int    rpcretries;
  123.     int    srvrpccnt[NFS_NPROCS];
  124.     int    srvrpc_errs;
  125.     int    srv_errs;
  126.     int    rpcrequests;
  127.     int    rpctimeouts;
  128.     int    rpcunexpected;
  129.     int    rpcinvalid;
  130.     int    srvcache_inproghits;
  131.     int    srvcache_idemdonehits;
  132.     int    srvcache_nonidemdonehits;
  133.     int    srvcache_misses;
  134.     int    srvnqnfs_leases;
  135.     int    srvnqnfs_maxleases;
  136.     int    srvnqnfs_getleases;
  137. };
  138.  
  139. /*
  140.  * Flags for nfssvc() system call.
  141.  */
  142. #define    NFSSVC_BIOD    0x002
  143. #define    NFSSVC_NFSD    0x004
  144. #define    NFSSVC_ADDSOCK    0x008
  145. #define    NFSSVC_AUTHIN    0x010
  146. #define    NFSSVC_GOTAUTH    0x040
  147. #define    NFSSVC_AUTHINFAIL 0x080
  148. #define    NFSSVC_MNTD    0x100
  149.  
  150. /*
  151.  * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts.
  152.  * What should be in this set is open to debate, but I believe that since
  153.  * I/O system calls on ufs are never interrupted by signals the set should
  154.  * be minimal. My reasoning is that many current programs that use signals
  155.  * such as SIGALRM will not expect file I/O system calls to be interrupted
  156.  * by them and break.
  157.  */
  158. #ifdef KERNEL
  159. #define    NFSINT_SIGMASK    (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \
  160.              sigmask(SIGHUP)|sigmask(SIGQUIT))
  161.  
  162. /*
  163.  * Socket errors ignored for connectionless sockets??
  164.  * For now, ignore them all
  165.  */
  166. #define    NFSIGNORE_SOERROR(s, e) \
  167.         ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
  168.         ((s) & PR_CONNREQUIRED) == 0)
  169.  
  170. /*
  171.  * Nfs outstanding request list element
  172.  */
  173. struct nfsreq {
  174.     struct nfsreq    *r_next;
  175.     struct nfsreq    *r_prev;
  176.     struct mbuf    *r_mreq;
  177.     struct mbuf    *r_mrep;
  178.     struct mbuf    *r_md;
  179.     caddr_t        r_dpos;
  180.     struct nfsmount *r_nmp;
  181.     struct vnode    *r_vp;
  182.     u_long        r_xid;
  183.     int        r_flags;    /* flags on request, see below */
  184.     int        r_retry;    /* max retransmission count */
  185.     int        r_rexmit;    /* current retrans count */
  186.     int        r_timer;    /* tick counter on reply */
  187.     int        r_procnum;    /* NFS procedure number */
  188.     int        r_rtt;        /* RTT for rpc */
  189.     struct proc    *r_procp;    /* Proc that did I/O system call */
  190. };
  191.  
  192. /* Flag values for r_flags */
  193. #define R_TIMING    0x01        /* timing request (in mntp) */
  194. #define R_SENT        0x02        /* request has been sent */
  195. #define    R_SOFTTERM    0x04        /* soft mnt, too many retries */
  196. #define    R_INTR        0x08        /* intr mnt, signal pending */
  197. #define    R_SOCKERR    0x10        /* Fatal error on socket */
  198. #define    R_TPRINTFMSG    0x20        /* Did a tprintf msg. */
  199. #define    R_MUSTRESEND    0x40        /* Must resend request */
  200. #define    R_GETONEREP    0x80        /* Probe for one reply only */
  201.  
  202. struct nfsstats nfsstats;
  203.  
  204. /*
  205.  * A list of nfssvc_sock structures is maintained with all the sockets
  206.  * that require service by the nfsd.
  207.  * The nfsuid structs hang off of the nfssvc_sock structs in both lru
  208.  * and uid hash lists.
  209.  */
  210. #define    NUIDHASHSIZ    32
  211. #define    NUIDHASH(uid)    ((uid) & (NUIDHASHSIZ - 1))
  212.  
  213. /*
  214.  * Network address hash list element
  215.  */
  216. union nethostaddr {
  217.     u_long had_inetaddr;
  218.     struct mbuf *had_nam;
  219. };
  220.  
  221. struct nfsuid {
  222.     struct nfsuid    *nu_lrunext;    /* MUST be first */
  223.     struct nfsuid    *nu_lruprev;
  224.     struct nfsuid    *nu_hnext;
  225.     struct nfsuid    *nu_hprev;
  226.     int        nu_flag;    /* Flags */
  227.     uid_t        nu_uid;        /* Uid mapped by this entry */
  228.     union nethostaddr nu_haddr;    /* Host addr. for dgram sockets */
  229.     struct ucred    nu_cr;        /* Cred uid mapped to */
  230. };
  231.  
  232. #define    nu_inetaddr    nu_haddr.had_inetaddr
  233. #define    nu_nam        nu_haddr.had_nam
  234. /* Bits for nu_flag */
  235. #define    NU_INETADDR    0x1
  236.  
  237. struct nfssvc_sock {
  238.     struct nfsuid    *ns_lrunext;    /* MUST be first */
  239.     struct nfsuid    *ns_lruprev;
  240.     struct nfssvc_sock *ns_next;
  241.     struct nfssvc_sock *ns_prev;
  242.     int        ns_flag;
  243.     u_long        ns_sref;
  244.     struct file    *ns_fp;
  245.     struct socket    *ns_so;
  246.     int        ns_solock;
  247.     struct mbuf    *ns_nam;
  248.     int        ns_cc;
  249.     struct mbuf    *ns_raw;
  250.     struct mbuf    *ns_rawend;
  251.     int        ns_reclen;
  252.     struct mbuf    *ns_rec;
  253.     struct mbuf    *ns_recend;
  254.     int        ns_numuids;
  255.     struct nfsuid    *ns_uidh[NUIDHASHSIZ];
  256. };
  257.  
  258. /* Bits for "ns_flag" */
  259. #define    SLP_VALID    0x01
  260. #define    SLP_DOREC    0x02
  261. #define    SLP_NEEDQ    0x04
  262. #define    SLP_DISCONN    0x08
  263. #define    SLP_GETSTREAM    0x10
  264. #define    SLP_INIT    0x20
  265. #define    SLP_WANTINIT    0x40
  266.  
  267. #define SLP_ALLFLAGS    0xff
  268.  
  269. /*
  270.  * One of these structures is allocated for each nfsd.
  271.  */
  272. struct nfsd {
  273.     struct nfsd    *nd_next;    /* Must be first */
  274.     struct nfsd    *nd_prev;
  275.     int        nd_flag;    /* NFSD_ flags */
  276.     struct nfssvc_sock *nd_slp;    /* Current socket */
  277.     struct mbuf    *nd_nam;    /* Client addr for datagram req. */
  278.     struct mbuf    *nd_mrep;    /* Req. mbuf list */
  279.     struct mbuf    *nd_md;
  280.     caddr_t        nd_dpos;    /* Position in list */
  281.     int        nd_procnum;    /* RPC procedure number */
  282.     u_long        nd_retxid;    /* RPC xid */
  283.     int        nd_repstat;    /* Reply status value */
  284.     struct ucred    nd_cr;        /* Credentials for req. */
  285.     int        nd_nqlflag;    /* Leasing flag */
  286.     int        nd_duration;    /* Lease duration */
  287.     int        nd_authlen;    /* Authenticator len */
  288.     u_char        nd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
  289.     struct proc    *nd_procp;    /* Proc ptr */
  290. };
  291.  
  292. #define    NFSD_WAITING    0x01
  293. #define    NFSD_CHECKSLP    0x02
  294. #define    NFSD_REQINPROG    0x04
  295. #define    NFSD_NEEDAUTH    0x08
  296. #define    NFSD_AUTHFAIL    0x10
  297. #endif    /* KERNEL */
  298.